#include <stdio.h>
#include <stdlib.h>         // malloc函数   
#include <strings.h>        // bzero函数
/*
    一、man手册的使用
        1、man -f 函数       // 找到该函数有哪几页(如：malloc函数， 只有第三页)
        2、man 3 malloc      // 阅读该文档，查看应该如何使用
        3、如何使用一个函数？？
            a、得知函数的作用
                  malloc, free, calloc, realloc - allocate and free dynamic memory  // 分配和释放动态内存

            b、声明函数头文件
                #include <stdlib.h>

            c、函数原型(参数有什么)
               void *malloc(size_t size);
                // 参数一：要申请的堆空间的大小

            d、得知函数返回值
               成功：返回一个指向该堆内存空间的指针
               失败：返回NULL
*/


int main(int argc, char const *argv[])
{
    // (1)、使用malloc函数申请内存空间
    // 1、定义并初始化
    char *p_buf =(char *)malloc(sizeof(char)*5);       // 申请一块堆内存空间(该内存空间没有初始化)
    bzero(p_buf, sizeof(sizeof(char)*5));       // 将malloc申请的堆内存空间清零

    // 2、使用
    // a、指针样式的赋值
    for (int i = 0; i < 5; i++)
    {
       *(p_buf+i) = i;
       printf("*(p_buf+%d) = %d\n", i, *(p_buf+i));
    }
    
    // c、数组样式的赋值
    for (int i = 0; i < 5; i++)
    {
       p_buf[i] = i*10;
       printf(" p_buf[%d] = %d\n", i,  p_buf[i]);
    }

    // 3、释放内存
    free(p_buf);


    // (2)、使用calloc函数来申请内存
    // 1、定义
    int *p2_buf = calloc(5, sizeof(int));

    // 2、使用
    // a、指针样式的赋值
    for (int i = 0; i < 5; i++)
    {
       *(p2_buf+i) = i;
       printf("*(p2_buf+%d) = %d\n", i, *(p2_buf+i));
    }
    
    // c、数组样式的赋值
    for (int i = 0; i < 5; i++)
    {
       p2_buf[i] = i*10;
       printf(" p2_buf[%d] = %d\n", i,  p2_buf[i]);
    }

    // 3、释放堆空间
    free(p2_buf);
    return 0;
}
